package com.yangl.corejava.thread.blockingqueue;

import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by yangl on 2017/4/30.
 * 生产者
 */
public class Producer implements Runnable {

    private BlockingQueue<String> queue;
//volatile在这里可以做到的作用是使得多个线程可以共享变量，
// 但是问题在于使用volatile将使得VM优化失去作用，导致效率较低，所以要在必要的时候使用，因此AtomicInteger类不要随意使用，要在使用场景下使用。
    private volatile boolean isRunning = true;

    private static AtomicInteger count = new AtomicInteger();

    private static final int DEFAULT_RANGE_FOR_SLEEP = 1000;

    public Producer(BlockingQueue<String> queue){
         this.queue = queue;
    }

    public void run() {

        String data = null;
        Random r = new Random();
        System.out.println("启动生产者线程！");
        try {
            while(isRunning){
                System.out.println("正在生产数据！");
                Thread.sleep(DEFAULT_RANGE_FOR_SLEEP);
                // 原子整型的incrementAndGet方法，以原子方式将当前值加 1，返回更新的值
                data = "data:" + count.incrementAndGet();
                System.out.println("将数据" + data + "放入队列...");
                if(!queue.offer(data, 2, TimeUnit.SECONDS)){
                    System.out.println("放入数据失败：" + data);
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
            Thread.currentThread().interrupt();
        } finally {
            System.out.println("退出生产者线程！");
        }

    }

    public void stop(){
        isRunning = false;
    }

}
